package com.ruoyi.web.controller.pay;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.order.service.WechatPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 支付控制器
 */
@RestController
@RequestMapping("/pay")
public class PayController extends BaseController {

    @Autowired
    private WechatPayService wechatPayService;

    /**
     * 测试支付配置
     */
    @GetMapping("/test-config")
    public AjaxResult testConfig() {
        try {
            Map<String, Object> config = wechatPayService.testConfig();
            return AjaxResult.success(config);
        } catch (Exception e) {
            logger.error("测试配置失败", e);
            return AjaxResult.error("测试配置失败：" + e.getMessage());
        }
    }

    /**
     * 创建支付订单（通用）
     */
    @PostMapping("/create-order")
    public AjaxResult createOrder(@RequestBody Map<String, Object> params) {
        try {
            Integer amount = (Integer) params.get("amount");
            String description = (String) params.get("description");
            LoginUser loginUser = getLoginUser();
            Long userId = loginUser.getUserId();
            String openid = loginUser.getUser().getOpenId();

            if (amount == null || description == null) {
                return AjaxResult.error("参数不完整");
            }

            if (openid == null) {
                return AjaxResult.error("用户未绑定微信");
            }

            // 创建支付订单
            Map<String, Object> payParams = wechatPayService.createOrder(openid, amount, description, userId);
            return AjaxResult.success(payParams);
        } catch (Exception e) {
            logger.error("创建支付订单失败", e);
            return AjaxResult.error("创建订单失败：" + e.getMessage());
        }
    }

    /**
     * 按打印订单创建微信支付
     * 前端传入 printOrderId，由后端读取订单金额与标题，使用订单号作为 out_trade_no
     */
    @PostMapping("/create-order/print")
    public AjaxResult createOrderForPrint(@RequestBody Map<String, Object> params) {
        try {
            Object idObj = params.get("printOrderId");
            if (idObj == null) {
                return AjaxResult.error("缺少printOrderId");
            }
            Long printOrderId = Long.valueOf(String.valueOf(idObj));

            LoginUser loginUser = getLoginUser();
            Long userId = loginUser.getUserId();
            String openid = loginUser.getUser().getOpenId();
            if (openid == null) {
                return AjaxResult.error("用户未绑定微信");
            }

            // 通过订单服务获取订单信息，而不是直接访问 Mapper
            // 这里需要调用订单服务接口
            // PrintOrder order = orderService.getOrderById(printOrderId, userId);

            // 暂时返回错误，提示使用新的订单模块接口
            return AjaxResult.error("请使用 /api/print/order/{id}/pay 接口");
        } catch (Exception e) {
            logger.error("按打印订单创建支付失败", e);
            return AjaxResult.error("创建支付失败：" + e.getMessage());
        }
    }

    /**
     * 微信支付回调通知
     * 注意：正式环境中应验证微信签名与解密资源，鉴权通过后再更新订单。
     * 这里先按 out_trade_no 直接更新对应打印订单为已支付。
     */
    @PostMapping("/notify/wechat")
    public String wechatNotify(@RequestBody Map<String, Object> notifyBody) {
        try {
            // 此处省略签名校验与解密，直接读取 out_trade_no
            Object outTradeNoObj = notifyBody.get("out_trade_no");
            if (outTradeNoObj == null) {
                logger.warn("回调缺少out_trade_no: {}", notifyBody);
                return "FAIL";
            }
            String outTradeNo = String.valueOf(outTradeNoObj);

            // 通过订单服务更新订单状态，而不是直接访问 Mapper
            // 这里需要调用订单服务接口
            // boolean success = orderService.updateOrderStatusByOrderNo(outTradeNo,
            // "paid");

            // 暂时返回成功，实际需要调用订单服务
            logger.info("订单回调收到，orderNo={}，需要调用订单服务更新状态", outTradeNo);
            return "SUCCESS";
        } catch (Exception e) {
            logger.error("处理微信支付回调异常", e);
            return "FAIL";
        }
    }
}